//自定义shell的编写
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <unistd.h>
#include <errno.h>


#define PROMPT_SIZE 1024
#define FORMAT "%s@%s:%s#"
//全局的环境变量表
//这里只是为了模仿初始化全局变量表的过程，实际上shell中并没有这个东西
#define MAX_ENVS 100
char *g_env[MAX_ENVS];
int g_envs = 0;

void InitEnv()
{
    //这个是可变的每个进程独立拥有的全局变量表参数
    extern char** environ;
    //先重置g_envs
    g_envs = 0;
    for(int i = 0;environ[i];i++)
    {
        g_env[i] = environ[i];
        g_envs++;
    }
    //因为从父进程获取的全局变量表和父进程的没区别，为了证明我们确实从父进程中读取并写入了自己的进程中，自己插入一个环境变量
    g_env[g_envs++] = (char*)"HAHA=for test";
    g_env[g_envs] = NULL;//C语言的字符串是以\0结尾
    //我们定义的全局变量表相当于一个缓冲区，所以此时还需要将读取到的环境变量导出
    for(int i = 0;g_env[i];i++)
    {
        putenv(g_env[i]);        
    }
    environ = g_env;
}
const char* GetUserName()
{
    const char* username = getenv("USER");
    return username == NULL ? "None" : username;
}
const char* GetHostName()
{
    char hostname[128];
    int ret = gethostname(hostname,sizeof(hostname));
    if(ret < 0)
    {
        perror("gethostname");
        exit(1);
    }
    return hostname == NULL ? "None" :(const char*)hostname;
}
std::string GetPwd()
{
    std::string pwd;
    
}
char* DirName(const char* pwd)
{

}
void MakePrompt(char prompt[],int size)
{
    //怎么定义的就怎么传参,传的是数组就用数组接受
    //用户名@主机名:~/一直到当前工作目录#（区分系统shell和自定义shell)
    snprintf(prompt,size,FORMAT,GetUserName(),GetHostName(),DirName(GetPwd().c_str()));
}
void PrintCommandPrompt()
{
    //定义一个缓冲区
    char prompt[PROMPT_SIZE];
    //传入缓冲区（输出型参数）
    MakePrompt(prompt,sizeof(prompt));
    printf("%s",prompt);
    fflush(stdout);
}
int main()
{
    //shell启动后，从系统的配置文件中获取环境变量
    //而我们的shell从父shell中获取,并且我们要模仿父shell维护一张环境变量表
    //初始化环境变量表
    InitEnv();
    while(true)
    {
        //1.打印提示信息
        PrintCommandPrompt();
        //2.获取命令行参数
        //3.解析命令行参数
        //4.执行命令
    }
    return 0;
}